package BehaviorPattern.Iterator;

/**
 * @author: Themberfue
 * @date: 2025/8/14 10:48
 * @description:
 */
// 1. 迭代器接口
interface Iterator {
    boolean hasNext();  // 判断是否有下一个元素
    Object next();      // 获取下一个元素
}

// 2. 具体迭代器：书架迭代器
class BookShelfIterator implements Iterator {
    private BookShelf bookShelf;  // 持有聚合对象的引用
    private int index;            // 当前遍历的位置

    public BookShelfIterator(BookShelf bookShelf) {
        this.bookShelf = bookShelf;
        this.index = 0;  // 从第一个元素开始遍历
    }

    @Override
    public boolean hasNext() {
        // 如果当前索引小于书架的书籍数量，则还有下一个元素
        return index < bookShelf.getLength();
    }

    @Override
    public Object next() {
        // 获取当前位置的书籍，并将索引+1
        Book book = bookShelf.getBookAt(index);
        index++;
        return book;
    }
}

// 3. 聚合接口
interface Aggregate {
    Iterator iterator();  // 创建迭代器
}

// 4. 具体聚合：书架
class BookShelf implements Aggregate {
    private Book[] books;  // 用数组存储书籍（内部表示）
    private int last = 0;  // 记录最后一本书的位置

    public BookShelf(int maxSize) {
        this.books = new Book[maxSize];  // 初始化数组
    }

    public Book getBookAt(int index) {
        return books[index];  // 获取指定位置的书籍
    }

    public void appendBook(Book book) {
        this.books[last] = book;  // 添加书籍到书架
        last++;
    }

    public int getLength() {
        return last;  // 返回书架上的书籍数量
    }

    @Override
    public Iterator iterator() {
        // 返回书架对应的迭代器
        return new BookShelfIterator(this);
    }
}

// 书籍类（被遍历的元素）
class Book {
    private String name;

    public Book(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

// 客户端代码
public class IteratorExample {
    public static void main(String[] args) {
        // 创建一个最多容纳5本书的书架
        BookShelf bookShelf = new BookShelf(5);
        // 向书架添加书籍
        bookShelf.appendBook(new Book("《设计模式》"));
        bookShelf.appendBook(new Book("《Java编程思想》"));
        bookShelf.appendBook(new Book("《数据结构与算法》"));
        bookShelf.appendBook(new Book("《计算机网络》"));

        // 获取迭代器
        Iterator iterator = bookShelf.iterator();
        // 使用迭代器遍历书架
        while (iterator.hasNext()) {
            Book book = (Book) iterator.next();
            System.out.println("书籍名称：" + book.getName());
        }
    }
}
